package com.hlkj.warboot.configurer.security.authentization;

import com.hlkj.warboot.configurer.security.SecurityUser;
import com.hlkj.warboot.configurer.util.LoggerUtil;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.text.MessageFormat;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @Description 判断当前登陆用户是否授权访问该请求
 * @Author 李星
 * @Date 2019/6/29 22:53
 */
@Component
public class MyAuthentization {

    /*
     * @Description 是否授权
     * @Author 李星
     * @Date 2019/6/2 14:25
     * @Param [request, authentication]
     * @return boolean
     */
    public boolean isAuthentizated(HttpServletRequest request, Authentication authentication) {
        boolean flag = false; // 默认当前请求非法，不允许访问
        String reqUrl = request.getServletPath(); // 当前请求的url，格式：/sys/admin/index

        //Object principal = authentication.getPrincipal();  // 认证成功的用户信息
        SecurityUser baseUserPojo = (SecurityUser) authentication.getPrincipal();
        if (baseUserPojo == null) {
            return false;
        }

        // 获取用户的权限信息，并判断当前请求的URL是否被包含在内
        Set<String> authorities = authentication.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toSet()); // 当前用户的角色、权限信息
        for (String authoritie : authorities) {
            if (authoritie.equalsIgnoreCase("ROLE_SUPERADMIN")) { // TODO 超级管理员
                flag = true;
                break;
            } else if (authoritie.equalsIgnoreCase("ROLE_ADMIN")) { // TODO 管理员
                // TODO 对基础访问链接进行授权，这些链接无需配置到权限链表中
                // 对基础访问链接进行授权，这些链接无需配置到权限链表中
                String baseUrl = "/sys/admin/index,/sys/admin/welcome,/sys/admin/toUserInfo/base,/sys/admin/toUserInfo/pwd,/sys/admin/toUpdateCover";
                if (baseUrl.contains(reqUrl)) {
                    flag = true;
                    break;
                }
            } else if (authoritie.equalsIgnoreCase("ROLE_USER")) { // TODO 用户
                break;
            }

            // TODO 判断权限
            if (reqUrl.contains(authoritie)) {
                flag = true;
                break;
            }
        }

        LoggerUtil.info(MessageFormat.format("【{0}✈✈✈✈✈✈{1}，{2}】", baseUserPojo.getUsername(), reqUrl, flag ? "授权成功" : "授权失败"));
        return flag;
    }
}
